#define _CRT_SECURE_NO_WARNINGS
//#include<stdio.h>
//#include<string.h>
//void func(char* str)
//
//{
//
//	int sz = strlen(str);
//	char tmp;
//	int i = 1;
//	for(tmp = *(str + sz - i);tmp != '\0';i++)
//	{
//		
//
//		*(str + sz - i) = *str;
//
//		*str = tmp;
//	}
//}
//
//int main()
//
//{
//
//	char arr[100];
//
//	scanf("%s", arr);
//
//	func(arr);
//
//	printf("%s", arr);
//
//	return 0;
//
//}
//#include <stdio.h>
//#include <stdlib.h>
//
//int compare(const void* a, const void* b) {
//    return (*(int*)a - *(int*)b);
//}
//
//int minCost(int* piles, int n) {
//    int cost = 0;
//    while (n > 1) {
//
//        qsort(piles, n, sizeof(int), compare);
//
//        int sum = piles[0] + piles[1];
//        cost += sum;
//        piles[0] = sum;
//        piles[1] = piles[n - 1];
//        n--;
//    }
//    return cost;
//}
//
//int main() {
//    int n;
//    printf("Enter the number of piles: ");
//    scanf("%d", &n);
//
//    int* piles = (int*)malloc(n * sizeof(int));
//    for (int i = 0; i < n; i++) {
//        scanf("%d", &piles[i]);
//    }
//
//    int result = minCost(piles, n);
//    printf("%d", result);
//
//    free(piles);
//    return 0;
//}#include <stdio.h>
#include <stdlib.h>

int compare(void* a, void* b)
{
    return (*(int*)a - *(int*)b);
}

int minCost(int* p, int n) {
    int cost = 0;
    while (n > 1)
    {
        qsort(piles, n, sizeof(int), compare);
        int sum = p[0] + p[1];
        cost += sum;
        p[0] = sum;
        p[1] = p[n - 1];
        n--;
    }
    return cost;
}

int main() {
    int n;
    scanf("%d", &n);
    int* piles = (int*)malloc(n * sizeof(int));
    for (int i = 0; i < n; i++) {
        scanf("%d", &piles[i]);
    }
    int result = minCost(piles, n);
    printf("%d", result);
    free(piles);
    return 0;
}